/**
 * 标签页状态管理 Store
 * 使用 Pinia 管理应用程序中标签页的状态和操作
 * 提供标签页的增删改查、切换等功能
 */

import { defineStore } from 'pinia'
import { ref } from 'vue'

/**
 * 定义标签页状态管理 Store
 * 使用 Composition API 风格定义 store
 */
export const useTabsStore = defineStore('tabs', () => {
  /**
   * 已打开的标签页列表
   * 每个标签页对象包含：path(路径)、name(名称)、title(标题)、closable(是否可关闭)
   */
  const tabs = ref([
    {
      path: '/index',      // 路由路径
      name: 'index',       // 路由名称
      title: '首页',         // 显示标题
      closable: false          // 首页不可关闭，确保始终有一个可用页面
    }
  ])

  /**
   * 当前激活的标签页路径
   * 默认激活首页页面
   */
  const activeTab = ref('/index')

  /**
   * 添加新的标签页
   * @param {Object} route - Vue Router 路由对象
   * @param {string} route.path - 路由路径
   * @param {string} route.name - 路由名称
   * @param {Object} route.meta - 路由元信息
   * @param {string} route.meta.title - 页面标题
   */
  const addTab = (route) => {
    const { path, name, meta, params } = route

    // 生成标签页标题
    let title = meta?.title || name || '未命名页面'

    // 对于统计页面，在标题中包含相关信息
    if (name === '个人客户列表') {
      const employeeName = params?.name
      if (employeeName) {
        title = `个人客户列表`
      }
    } else if (name === '团队客户列表') {
      const employeeName = params?.name
      if (employeeName) {
        title = `团队客户列表`
      }
    } else if (name === '来访登记客户列表') {
      const employeeName = params?.name
      if (employeeName) {
        title = `来访登记客户列表`
      }
    } else if (name === '下级个人业绩排行') {
      const date = params?.date,
        employeeName = params?.name;
      if (date) {
        title = `下级个人业绩排行`
      }
    } else if (name === '下级部门业绩排行') {
      const date = params?.date,
        employeeName = params?.name;
      if (date) {
        title = `下级部门业绩排行`
      }
    }

    // 定义需要基于路由名称去重的路由列表
    const uniqueByNameRoutes = ['customers', 'teamCustomers', 'visitors', 'PersonalRanks', 'DeptRanks']

    let existingTab = null

    // 对于特定路由，基于路由名称查找是否已存在
    if (uniqueByNameRoutes.includes(name)) {
      existingTab = tabs.value.find(tab => tab.name === name)
      if (existingTab) {
        // 如果已存在同名标签页，更新其路径和标题
        existingTab.path = path
        existingTab.title = title
      }
    } else {
      // 对于其他路由，基于完整路径查找是否已存在
      existingTab = tabs.value.find(tab => tab.path === path)
    }

    if (!existingTab) {
      // 添加新标签页到列表
      tabs.value.push({
        path,
        name,
        title,
        closable: path !== '/index' // 除了首页，其他页面都可关闭
      })
    }


    // 设置新添加的标签页为当前激活状态
    activeTab.value = path
  }

  /**
   * 移除指定的标签页
   * @param {string} targetPath - 要移除的标签页路径
   * @returns {string} 移除后应该激活的标签页路径
   */
  const removeTab = (targetPath) => {
    // 查找目标标签页的索引
    const targetIndex = tabs.value.findIndex(tab => tab.path === targetPath)

    // 如果标签页不存在，直接返回
    if (targetIndex === -1) return

    // 如果关闭的是当前激活的标签页，需要切换到其他标签页
    if (activeTab.value === targetPath) {
      // 智能选择下一个激活的标签页
      if (targetIndex < tabs.value.length - 1) {
        // 如果不是最后一个，激活下一个标签页
        activeTab.value = tabs.value[targetIndex + 1].path
      } else if (targetIndex > 0) {
        // 如果是最后一个，激活前一个标签页
        activeTab.value = tabs.value[targetIndex - 1].path
      } else {
        // 如果只剩一个标签页，激活首页
        activeTab.value = '/index'
      }
    }

    // 从标签页列表中移除目标标签页
    tabs.value.splice(targetIndex, 1)

    // 通知清理页面刷新key
    if (window.clearPageRefreshKey) {
      window.clearPageRefreshKey(targetPath)
    }

    // 返回新的激活标签页路径
    return activeTab.value
  }

  /**
   * 关闭除指定标签页外的其他所有标签页
   * @param {string} currentPath - 要保留的标签页路径
   */
  const closeOtherTabs = (currentPath) => {
    // 只保留当前标签页和首页
    tabs.value = tabs.value.filter(tab =>
      tab.path === currentPath || tab.path === '/index'
    )
    // 设置当前标签页为激活状态
    activeTab.value = currentPath
  }

  /**
   * 关闭所有标签页（除了首页）
   * 首页始终保留，确保用户有地方可去
   */
  const closeAllTabs = () => {
    // 只保留首页标签页
    tabs.value = tabs.value.filter(tab => tab.path === '/index')
    // 激活首页
    activeTab.value = '/index'

    // 清理所有页面刷新key
    if (window.clearAllPageRefreshKeys) {
      window.clearAllPageRefreshKeys()
    }
  }

  /**
   * 设置当前激活的标签页
   * @param {string} path - 要激活的标签页路径
   */
  const setActiveTab = (path) => {
    activeTab.value = path
  }

  /**
   * 获取当前需要缓存的组件名称列表
   * @returns {Array} 缓存的组件名称数组
   */
  const getCachedComponents = () => {
    // 缓存所有已打开的标签页
    const cached = tabs.value
      .filter(tab => tab.title !== '首页') // 排除首页，因为它通常不需要缓存
      .map(tab => tab.title) // 使用title作为组件名称，因为动态路由会将menu_name设置为组件的name
    return cached
  }

  /**
   * 返回 store 的状态和方法
   * 供组件使用的公共 API
   */
  return {
    // 状态
    tabs,           // 标签页列表
    activeTab,      // 当前激活的标签页

    // 方法
    addTab,         // 添加标签页
    removeTab,      // 移除标签页
    closeOtherTabs, // 关闭其他标签页
    closeAllTabs,   // 关闭所有标签页
    setActiveTab,   // 设置激活标签页
    getCachedComponents // 获取缓存列表
  }
})
